12 February 2022

CTD casts from eDNA sampling off the Sashin on 10 May, 2021.

library(tidyr)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
library(readr)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
library(stringr)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
library(lubridate)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
library(hms)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
library(dplyr)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
library(ggplot2)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
library(RColorBrewer)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
library(lubridateExtras)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# read in all files in the reheaded directory
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# dataFiles <- lapply(Sys.glob("CTDCasts/reheaded/*.csv"), read_csv)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# # turn each of the data frames in that list into a single data frame
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# ctd.data <- do.call("rbind", dataFiles)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ctd.w.tides.dist <- read_csv("../data/ctdDataframe.csv") %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  filter(distance != 100)
Rows: 2538 Columns: 16── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr   (2): ctd_sample, tide
dbl  (13): lat, long, depth_m, salinity, density, pressure_decibar, temp_c, conductivity, sp_conduct, sound_velocity, duration, id, distance
dttm  (1): time
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# organize the headers, etc.
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# ctd.data2 <- ctd.data %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   rename(pressure_decibar = `Pressure (Decibar)`, depth_m = `Depth (Meter)`, temp_c = `Temperature (Celsius)`, conductivity = `Conductivity (MicroSiemens per Centimeter)`, sp_conduct = `Specific conductance (MicroSiemens per Centimeter)`, salinity = `Salinity (Practical Salinity Scale)`, sound_velocity = `Sound velocity (Meters per Second)`, density = `Density (Kilograms per Cubic Meter)`, file = `% File name`, lat = `% Start latitude`, long = `% Start longitude`, duration = `% Cast duration (Seconds)`, time = `% Cast time (local)`) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   separate(file, into = c(NA, NA, "ctd_sample"), sep = "_") %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   select(ctd_sample, time, lat, long, depth_m, salinity, density, pressure_decibar, temp_c, conductivity, sp_conduct, sound_velocity, duration)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# # add tide info
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# ctd.w.tides <- ctd.data2 %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   mutate(tide = ifelse(hour(hms::as_hms(time)) >12, "PM_outgoing", "AM_incoming"))
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# ctd.w.tides %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   select(lat) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   unique() %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   arrange(lat)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Convert longitude to meters from chum pens

This will match the other plots in the series.

# meta <- read_csv("../metadata/amalga_clean_metadata.csv")
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# dist <- meta %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   filter(!is.na(distance)) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   arrange(distance) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   select(distance) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   unique()
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# dist2x <- dist %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   bind_rows(dist)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# # each cast (ctd_sample) represents one of the 80m sampling intervals
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# ctd.w.dist <- ctd.w.tides %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   arrange(time) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   select(time) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   unique() %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   mutate(id = row_number()) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   bind_cols(dist2x)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# # bind it back together
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# ctd.w.tides.dist <- ctd.w.tides %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   left_join(., ctd.w.dist)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# QC: are the data what we think they are?
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ctd.w.tides.dist %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    mutate(tide = ifelse(tide == "AM_incoming", "incoming tide (AM)", "outgoing tide (PM)")) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  ggplot(aes(x = long, y = lat, color = tide, linetype = tide, label = ctd_sample)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
 # geom_line() +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  #geom_point(size = 0.1)+
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  geom_text(size = 2.5)+
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  facet_grid(rows = vars(tide)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  theme_bw()+
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
   theme(
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    axis.title.x = element_text(margin = margin(t=10)),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    axis.title.y = element_text(margin = margin(r=10))
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  ) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  labs(y = "Latitude",
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
       x = "Longitude") +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  scale_color_manual(values = c("firebrick1", "midnightblue"))
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ggsave("pdf_outputs/ctdSimpleLatLon.pdf")
Saving 7.29 x 4.51 in imageError in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Output that dataframe so that I can plot the transect on the bathy map

# ctd.w.tides.dist %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#   write_csv("csv_outputs/ctdDataframe.csv")
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Ultimately, turn this into a map of the transect rather than an x-y plot.

max/min surface water temperature vs. at depth

ctd.w.tides.dist %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  #filter(distance == 0) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  ggplot(aes(x = temp_c, y = -1*depth_m, color = tide)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  geom_point()
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ctd.w.tides.dist %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  filter(depth_m > 9 & depth_m < 11) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  summarise(min(temp_c))
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ctd.w.tides.dist %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  group_by(tide) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  filter(depth_m > 1) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  summarise(min(temp_c))
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Plotting CTD profiles

# salinity
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ctd.w.tides.dist %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  filter(salinity > 20) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  mutate(tide = ifelse(tide == "AM_incoming", "incoming tide (AM)", "outgoing tide (PM)")) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  ggplot(aes(x = density, y = -1*(depth_m), color = distance)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  geom_point() +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  facet_grid(rows = vars(tide)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  theme_bw()+
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
   theme(
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    axis.title.x = element_text(margin = margin(t=10)),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    axis.title.y = element_text(margin = margin(r=10))
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  ) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  labs(y = "Depth (m)",
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
       x = "Density",
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
       color = "Distance")
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

  
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
#ggsave("pdf_outputs/ctdSalinityProfile.pdf", width = 8, height = 5)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Salinity: zoomed in

# temp
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ctd.w.tides.dist %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    filter(salinity > 20) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  mutate(tide = ifelse(tide == "AM_incoming", "incoming tide (AM)", "outgoing tide (PM)")) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  filter(depth_m < 10) %>% # top three meters of the surface
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  ggplot(aes(x = density, y = -1*(depth_m), color = distance)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  geom_point() +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  facet_grid(rows = vars(tide)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  theme_bw()+
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
   theme(
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    axis.title.x = element_text(margin = margin(t=10)),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    axis.title.y = element_text(margin = margin(r=10))) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  labs(y = "Depth (m)",
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
       x = "Density (kg/m^3)",
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
       color = "Distance (m)")
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

#ggsave("pdf_outputs/ctdSalinityProfile5m.pdf", width = 8, height = 5)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Plotting a surface with temperature and longitude

https://github.com/cathmmitchell/plottingOceanDataWithR/wiki/Irregular-data

binned <- ctd.w.tides.dist %>% 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    mutate(tide = ifelse(tide == "AM_incoming", "incoming tide (AM)", "outgoing tide (PM)")) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  filter(depth_m < 10) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  mutate_at(5, round)%>% 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  group_by(distance, tide, depth_m) %>% 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  summarize(av_tmp = mean(temp_c))
`summarise()` has grouped output by 'distance', 'tide'. You can override using the `.groups` argument.Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# flip order so higher temps are at the top!
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
binned
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
tempplot <- ggplot(binned,aes(x=distance,y=-1*(depth_m))) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  facet_grid(rows = vars(tide))+
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  geom_contour_filled(aes(z=av_tmp), alpha = 0.8) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    geom_point(size =0.1) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  theme_bw()+
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
   theme(
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    axis.title.x = element_text(margin = margin(t=10)),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    axis.title.y = element_text(margin = margin(r=10))) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  labs(y = "Depth (m)",
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
       x = "Distance from hatchery pens (m)",
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
       fill = "Temperature (C)") +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  scale_x_continuous(expand = c(0,0)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  scale_y_continuous(expand = c(0,0.05)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  scale_fill_brewer(palette = "Spectral", direction = -1,
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
                    guide = guide_legend(reverse = T))
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
tempplot
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ggsave("pdf_outputs/ctdTemp10metersDistance.png", width = 8, height = 5)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

Why do some of the top depth values drop out? Something about the binning.

Do it once more, but setting the depth even shallower:

binned2 <- ctd.w.tides.dist %>% 
    mutate(tide = ifelse(tide == "AM_incoming", "incoming tide (AM)", "outgoing tide (PM)")) %>%
  filter(depth_m < 2.5) %>%
  mutate_at(5, round, 2)%>% 
  group_by(distance, tide, depth_m) %>% 
  summarize(av_tmp = mean(temp_c))
`summarise()` has grouped output by 'distance', 'tide'. You can override using the `.groups` argument.
ggplot(binned2,aes(x=distance,y=-1*(depth_m))) +
  facet_grid(rows = vars(tide))+
  geom_contour_filled(aes(z=av_tmp), alpha = 0.8) +
  geom_point(size =0.1) +
  theme_bw()+
   theme(
    axis.title.x = element_text(margin = margin(t=10)),
    axis.title.y = element_text(margin = margin(r=10))) +
  labs(y = "Depth (m)",
       x = "Distance from hatchery pens (m)",
       fill = "Temperature (C)")

ggsave("pdf_outputs/ctdTemp3metersDistance.pdf", width = 8, height = 5)

For salinity and temp, let’s zoom in on the top 5 meters (we took samples from the first ~1 m)

# temp
ctd.w.tides.dist %>%
  mutate(tide = ifelse(tide == "AM_incoming", "incoming tide (AM)", "outgoing tide (PM)")) %>%
  filter(depth_m < 5) %>%
  ggplot(aes(x = temp_c, y = -1*(depth_m), color = distance)) +
  geom_point() +
  facet_grid(rows = vars(tide)) +
  theme_bw()+
   theme(
    axis.title.x = element_text(margin = margin(t=10)),
    axis.title.y = element_text(margin = margin(r=10))) +
  labs(y = "Depth (m)",
       x = "Temperature (C)",
       color = "Distance (m)")

ggsave("pdf_outputs/ctdTempProfile3metersDistance.pdf", width = 8, height = 5)

Plotting a surface with salinity and longitude


binnedSalinity <- ctd.w.tides.dist %>% 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    mutate(tide = ifelse(tide == "AM_incoming", "incoming tide (AM)", "outgoing tide (PM)")) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  filter(depth_m < 10) %>%
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  mutate_at(5, round)%>% 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  group_by(distance, tide, depth_m) %>% 
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  summarize(av_salinity = mean(salinity))
`summarise()` has grouped output by 'distance', 'tide'. You can override using the `.groups` argument.Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
# oranize colors
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
mycolors <- colorRampPalette(brewer.pal(9, "Oranges"))(11)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
salplot <- ggplot(binnedSalinity, aes(x = distance, y = -1*(depth_m))) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  facet_grid(rows = vars(tide)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  geom_contour_filled(aes(z = av_salinity), alpha = 0.8) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    geom_point(size = 0.1) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
    theme_bw() +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
     theme(
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
      axis.title.x = element_text(margin = margin(t=10)),
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
      axis.title.y = element_text(margin = margin(r=10))) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
      labs(y = "Depth (m)",
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
           x = "Distance from hatchery pens (m)",
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
           fill = "Salinity (PSU)") +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  scale_x_continuous(expand = c(0,0)) +
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
  scale_y_continuous(expand = c(0,0.05))
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
salplot
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ggsave("pdf_outputs/ctdSalinity10metersDistance.png", width = 8, height = 5)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

binnedSal2 <- ctd.w.tides.dist %>% 
    mutate(tide = ifelse(tide == "AM_incoming", "incoming tide (AM)", "outgoing tide (PM)")) %>%
  filter(depth_m < 2.5) %>%
  mutate_at(5, round, 2)%>% 
  group_by(distance, tide, depth_m) %>% 
  summarize(av_sal = mean(salinity))
`summarise()` has grouped output by 'distance', 'tide'. You can override using the `.groups` argument.
ggplot(binnedSal2,aes(x=distance,y=-1*(depth_m))) +
  facet_grid(rows = vars(tide))+
  geom_contour_filled(aes(z=av_sal), alpha = 0.8) +
  geom_point(size =0.1) +
  theme_bw()+
   theme(
    axis.title.x = element_text(margin = margin(t=10)),
    axis.title.y = element_text(margin = margin(r=10))) +
  labs(y = "Depth (m)",
       x = "Distance from hatchery pens (m)",
       fill = "Salinity (PSU)")

ggsave("pdf_outputs/ctdSalinity3metersDistance.png", width = 8, height = 5)

library(patchwork)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
salplot + tempplot + plot_layout(nrow = 2) + plot_annotation(tag_levels = "A")
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument
ggsave("pdf_outputs/ctd_data2021_dualplot.png", width = 8, height = 8)
Error in exists(cacheKey, where = .rs.WorkingDataEnv, inherits = FALSE) : 
  invalid first argument

ctd.w.tides.dist %>%
  group_by(tide) %>%
  summarise(max(salinity))

Density

density1 <- ctd.w.tides.dist %>% 
  mutate(tide = ifelse(tide == "AM_incoming", "incoming tide (AM)", "outgoing tide (PM)")) %>%
  filter(depth_m < 10) %>%
  mutate_at(5, round)%>% 
  group_by(distance, tide, depth_m) %>% 
  summarize(av_density = mean(density)) # the avg needs to be taken for proper plotting in this way.
`summarise()` has grouped output by 'distance', 'tide'. You can override using the `.groups` argument.
ggplot(density1,aes(x=distance,y=-1*(depth_m))) +
  facet_grid(rows = vars(tide))+
  geom_contour_filled(aes(z=density), alpha = 0.8) +
    geom_point(size =0.1) +
  theme_bw()+
   theme(
    axis.title.x = element_text(margin = margin(t=10)),
    axis.title.y = element_text(margin = margin(r=10))) +
  labs(y = "Depth (m)",
       x = "Distance from hatchery pens (m)",
       fill = "Density (kg/m^3)")
Error in `geom_contour_filled()`:
! Problem while computing aesthetics.
ℹ Error occurred in the 1st layer.
Caused by error in `compute_aesthetics()`:
! Aesthetics are not valid data columns.
✖ The following aesthetics are invalid:
✖ `z = density`
ℹ Did you mistype the name of a data column or forget to add `after_stat()`?
Backtrace:
  1. base (local) `<fn>`(x)
  2. ggplot2:::print.ggplot(x)
  4. ggplot2:::ggplot_build.ggplot(x)
  5. ggplot2:::by_layer(...)
 12. ggplot2 (local) f(l = layers[[i]], d = data[[i]])
 13. l$compute_aesthetics(d, plot)
 14. ggplot2 (local) compute_aesthetics(..., self = self)

Tide data

Tide data was obtained from the NOAA Tides website: tidesandcurrents.noaa.gov

https://tidesandcurrents.noaa.gov/waterlevels.html?id=9452210&units=standard&bdate=20210510&edate=20210511&timezone=LST/LDT&datum=MLLW&interval=6&action=

Look at joining the tide data with the ctd data based on time

# double check the sampling to see if it overlaps slack tide?
tides.hour2 %>%
  filter(Date == "2022-05-05") %>%
  left_join(., ctd.times.2022, by = c("hour", "ymd")) %>%
  filter(tide == "AM_outgoing") %>%
  mutate(sampling_period = ifelse(is.na(ctd_sample), "no", "yes")) %>%
  filter(height_ft < min(height_ft)+1) %>%
  ggplot(aes(x = long, y = lat, color = newdate)) +
  geom_point()
Warning: Detected an unexpected many-to-many relationship between `x` and `y`.

Minimum tidal height was at 10:36; the parallel transect was sampled after 11 am, so it was as the tide turned.

# make supplemental figure
tidePlot2021 + tidePlot2022 + 
  plot_layout(ncol = 1) +
  plot_annotation(tag_levels = "A")

ggsave("pdf_outputs/SIfigure_tideCycle_bothYears.png", width = 8, height = 8)

LS0tCnRpdGxlOiAiMDgtY3RkLWNhc3QtZGF0YSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKMTIgRmVicnVhcnkgMjAyMgoKQ1REIGNhc3RzIGZyb20gZUROQSBzYW1wbGluZyBvZmYgdGhlIFNhc2hpbiBvbiAxMCBNYXksIDIwMjEuCgpgYGB7ciBsb2FkLWxpYnJhcmllc30KbGlicmFyeSh0aWR5cikKbGlicmFyeShyZWFkcikKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGx1YnJpZGF0ZSkKbGlicmFyeShobXMpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShSQ29sb3JCcmV3ZXIpCmxpYnJhcnkobHVicmlkYXRlRXh0cmFzKQoKYGBgCgpgYGB7ciByZWFkLWluLWNzdi1maWxlc30KIyByZWFkIGluIGFsbCBmaWxlcyBpbiB0aGUgcmVoZWFkZWQgZGlyZWN0b3J5CiMgZGF0YUZpbGVzIDwtIGxhcHBseShTeXMuZ2xvYigiQ1REQ2FzdHMvcmVoZWFkZWQvKi5jc3YiKSwgcmVhZF9jc3YpCiMgCiMgIyB0dXJuIGVhY2ggb2YgdGhlIGRhdGEgZnJhbWVzIGluIHRoYXQgbGlzdCBpbnRvIGEgc2luZ2xlIGRhdGEgZnJhbWUKIyBjdGQuZGF0YSA8LSBkby5jYWxsKCJyYmluZCIsIGRhdGFGaWxlcykKCmN0ZC53LnRpZGVzLmRpc3QgPC0gcmVhZF9jc3YoIi4uL2RhdGEvY3RkRGF0YWZyYW1lLmNzdiIpICU+JQogIGZpbHRlcihkaXN0YW5jZSAhPSAxMDApCgoKYGBgCgoKYGBge3IgZGF0YS1jbGVhbi11cH0KIyBvcmdhbml6ZSB0aGUgaGVhZGVycywgZXRjLgojIGN0ZC5kYXRhMiA8LSBjdGQuZGF0YSAlPiUKIyAgIHJlbmFtZShwcmVzc3VyZV9kZWNpYmFyID0gYFByZXNzdXJlIChEZWNpYmFyKWAsIGRlcHRoX20gPSBgRGVwdGggKE1ldGVyKWAsIHRlbXBfYyA9IGBUZW1wZXJhdHVyZSAoQ2Vsc2l1cylgLCBjb25kdWN0aXZpdHkgPSBgQ29uZHVjdGl2aXR5IChNaWNyb1NpZW1lbnMgcGVyIENlbnRpbWV0ZXIpYCwgc3BfY29uZHVjdCA9IGBTcGVjaWZpYyBjb25kdWN0YW5jZSAoTWljcm9TaWVtZW5zIHBlciBDZW50aW1ldGVyKWAsIHNhbGluaXR5ID0gYFNhbGluaXR5IChQcmFjdGljYWwgU2FsaW5pdHkgU2NhbGUpYCwgc291bmRfdmVsb2NpdHkgPSBgU291bmQgdmVsb2NpdHkgKE1ldGVycyBwZXIgU2Vjb25kKWAsIGRlbnNpdHkgPSBgRGVuc2l0eSAoS2lsb2dyYW1zIHBlciBDdWJpYyBNZXRlcilgLCBmaWxlID0gYCUgRmlsZSBuYW1lYCwgbGF0ID0gYCUgU3RhcnQgbGF0aXR1ZGVgLCBsb25nID0gYCUgU3RhcnQgbG9uZ2l0dWRlYCwgZHVyYXRpb24gPSBgJSBDYXN0IGR1cmF0aW9uIChTZWNvbmRzKWAsIHRpbWUgPSBgJSBDYXN0IHRpbWUgKGxvY2FsKWApICU+JQojICAgc2VwYXJhdGUoZmlsZSwgaW50byA9IGMoTkEsIE5BLCAiY3RkX3NhbXBsZSIpLCBzZXAgPSAiXyIpICU+JQojICAgc2VsZWN0KGN0ZF9zYW1wbGUsIHRpbWUsIGxhdCwgbG9uZywgZGVwdGhfbSwgc2FsaW5pdHksIGRlbnNpdHksIHByZXNzdXJlX2RlY2liYXIsIHRlbXBfYywgY29uZHVjdGl2aXR5LCBzcF9jb25kdWN0LCBzb3VuZF92ZWxvY2l0eSwgZHVyYXRpb24pCiMgCiMgCiMgIyBhZGQgdGlkZSBpbmZvCiMgY3RkLncudGlkZXMgPC0gY3RkLmRhdGEyICU+JQojICAgbXV0YXRlKHRpZGUgPSBpZmVsc2UoaG91cihobXM6OmFzX2htcyh0aW1lKSkgPjEyLCAiUE1fb3V0Z29pbmciLCAiQU1faW5jb21pbmciKSkKIyAKIyBjdGQudy50aWRlcyAlPiUKIyAgIHNlbGVjdChsYXQpICU+JQojICAgdW5pcXVlKCkgJT4lCiMgICBhcnJhbmdlKGxhdCkKCmBgYAoKCgojIyBDb252ZXJ0IGxvbmdpdHVkZSB0byBtZXRlcnMgZnJvbSBjaHVtIHBlbnMKClRoaXMgd2lsbCBtYXRjaCB0aGUgb3RoZXIgcGxvdHMgaW4gdGhlIHNlcmllcy4KYGBge3J9CiMgbWV0YSA8LSByZWFkX2NzdigiLi4vbWV0YWRhdGEvYW1hbGdhX2NsZWFuX21ldGFkYXRhLmNzdiIpCiMgCiMgZGlzdCA8LSBtZXRhICU+JQojICAgZmlsdGVyKCFpcy5uYShkaXN0YW5jZSkpICU+JQojICAgYXJyYW5nZShkaXN0YW5jZSkgJT4lCiMgICBzZWxlY3QoZGlzdGFuY2UpICU+JQojICAgdW5pcXVlKCkKIyAKIyBkaXN0MnggPC0gZGlzdCAlPiUKIyAgIGJpbmRfcm93cyhkaXN0KQoKIyAjIGVhY2ggY2FzdCAoY3RkX3NhbXBsZSkgcmVwcmVzZW50cyBvbmUgb2YgdGhlIDgwbSBzYW1wbGluZyBpbnRlcnZhbHMKIyBjdGQudy5kaXN0IDwtIGN0ZC53LnRpZGVzICU+JQojICAgYXJyYW5nZSh0aW1lKSAlPiUKIyAgIHNlbGVjdCh0aW1lKSAlPiUKIyAgIHVuaXF1ZSgpICU+JQojICAgbXV0YXRlKGlkID0gcm93X251bWJlcigpKSAlPiUKIyAgIGJpbmRfY29scyhkaXN0MngpCiMgCiMgIyBiaW5kIGl0IGJhY2sgdG9nZXRoZXIKIyBjdGQudy50aWRlcy5kaXN0IDwtIGN0ZC53LnRpZGVzICU+JQojICAgbGVmdF9qb2luKC4sIGN0ZC53LmRpc3QpCiAgCmBgYAoKCgpgYGB7cn0KIyBRQzogYXJlIHRoZSBkYXRhIHdoYXQgd2UgdGhpbmsgdGhleSBhcmU/CmN0ZC53LnRpZGVzLmRpc3QgJT4lCiAgICBtdXRhdGUodGlkZSA9IGlmZWxzZSh0aWRlID09ICJBTV9pbmNvbWluZyIsICJpbmNvbWluZyB0aWRlIChBTSkiLCAib3V0Z29pbmcgdGlkZSAoUE0pIikpICU+JQogIGdncGxvdChhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGNvbG9yID0gdGlkZSwgbGluZXR5cGUgPSB0aWRlLCBsYWJlbCA9IGN0ZF9zYW1wbGUpKSArCiAjIGdlb21fbGluZSgpICsKICAjZ2VvbV9wb2ludChzaXplID0gMC4xKSsKICBnZW9tX3RleHQoc2l6ZSA9IDIuNSkrCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyh0aWRlKSkgKwogIHRoZW1lX2J3KCkrCiAgIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0PTEwKSksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHI9MTApKQogICkgKwogIGxhYnMoeSA9ICJMYXRpdHVkZSIsCiAgICAgICB4ID0gIkxvbmdpdHVkZSIpICsKICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZmlyZWJyaWNrMSIsICJtaWRuaWdodGJsdWUiKSkKCmdnc2F2ZSgicGRmX291dHB1dHMvY3RkU2ltcGxlTGF0TG9uLnBkZiIpCgpgYGAKCgoKT3V0cHV0IHRoYXQgZGF0YWZyYW1lIHNvIHRoYXQgSSBjYW4gcGxvdCB0aGUgdHJhbnNlY3Qgb24gdGhlIGJhdGh5IG1hcApgYGB7cn0KIyBjdGQudy50aWRlcy5kaXN0ICU+JQojICAgd3JpdGVfY3N2KCJjc3Zfb3V0cHV0cy9jdGREYXRhZnJhbWUuY3N2IikKCmBgYAoKCgpVbHRpbWF0ZWx5LCB0dXJuIHRoaXMgaW50byBhIG1hcCBvZiB0aGUgdHJhbnNlY3QgcmF0aGVyIHRoYW4gYW4geC15IHBsb3QuCgptYXgvbWluIHN1cmZhY2Ugd2F0ZXIgdGVtcGVyYXR1cmUgdnMuIGF0IGRlcHRoCmBgYHtyIHN1bW1hcnktd2F0ZXItdGVtcHN9CmN0ZC53LnRpZGVzLmRpc3QgJT4lCiAgI2ZpbHRlcihkaXN0YW5jZSA9PSAwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB0ZW1wX2MsIHkgPSAtMSpkZXB0aF9tLCBjb2xvciA9IHRpZGUpKSArCiAgZ2VvbV9wb2ludCgpCgoKYGBgCmBgYHtyIHRlbXAtYXQtMTBtLWRlcHRofQpjdGQudy50aWRlcy5kaXN0ICU+JQogIGZpbHRlcihkZXB0aF9tID4gOSAmIGRlcHRoX20gPCAxMSkgJT4lCiAgc3VtbWFyaXNlKG1pbih0ZW1wX2MpKQoKCmBgYAoKYGBge3IgdGVtcC1hdC1zdXJmYWNlfQpjdGQudy50aWRlcy5kaXN0ICU+JQogIGdyb3VwX2J5KHRpZGUpICU+JQogIGZpbHRlcihkZXB0aF9tID4gMSkgJT4lCiAgc3VtbWFyaXNlKG1pbih0ZW1wX2MpKQoKCgpgYGAKCgoKCiMjIFBsb3R0aW5nIENURCBwcm9maWxlcwoKYGBge3J9CiMgc2FsaW5pdHkKY3RkLncudGlkZXMuZGlzdCAlPiUKICBmaWx0ZXIoc2FsaW5pdHkgPiAyMCkgJT4lCiAgbXV0YXRlKHRpZGUgPSBpZmVsc2UodGlkZSA9PSAiQU1faW5jb21pbmciLCAiaW5jb21pbmcgdGlkZSAoQU0pIiwgIm91dGdvaW5nIHRpZGUgKFBNKSIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBkZW5zaXR5LCB5ID0gLTEqKGRlcHRoX20pLCBjb2xvciA9IGRpc3RhbmNlKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyh0aWRlKSkgKwogIHRoZW1lX2J3KCkrCiAgIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0PTEwKSksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHI9MTApKQogICkgKwogIGxhYnMoeSA9ICJEZXB0aCAobSkiLAogICAgICAgeCA9ICJEZW5zaXR5IiwKICAgICAgIGNvbG9yID0gIkRpc3RhbmNlIikKICAKCiNnZ3NhdmUoInBkZl9vdXRwdXRzL2N0ZFNhbGluaXR5UHJvZmlsZS5wZGYiLCB3aWR0aCA9IDgsIGhlaWdodCA9IDUpCmBgYApTYWxpbml0eTogem9vbWVkIGluCmBgYHtyfQojIHRlbXAKY3RkLncudGlkZXMuZGlzdCAlPiUKICAgIGZpbHRlcihzYWxpbml0eSA+IDIwKSAlPiUKICBtdXRhdGUodGlkZSA9IGlmZWxzZSh0aWRlID09ICJBTV9pbmNvbWluZyIsICJpbmNvbWluZyB0aWRlIChBTSkiLCAib3V0Z29pbmcgdGlkZSAoUE0pIikpICU+JQogIGZpbHRlcihkZXB0aF9tIDwgMTApICU+JSAjIHRvcCB0aHJlZSBtZXRlcnMgb2YgdGhlIHN1cmZhY2UKICBnZ3Bsb3QoYWVzKHggPSBkZW5zaXR5LCB5ID0gLTEqKGRlcHRoX20pLCBjb2xvciA9IGRpc3RhbmNlKSkgKwogIGdlb21fcG9pbnQoKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyh0aWRlKSkgKwogIHRoZW1lX2J3KCkrCiAgIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0PTEwKSksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHI9MTApKSkgKwogIGxhYnMoeSA9ICJEZXB0aCAobSkiLAogICAgICAgeCA9ICJEZW5zaXR5IChrZy9tXjMpIiwKICAgICAgIGNvbG9yID0gIkRpc3RhbmNlIChtKSIpCgojZ2dzYXZlKCJwZGZfb3V0cHV0cy9jdGRTYWxpbml0eVByb2ZpbGU1bS5wZGYiLCB3aWR0aCA9IDgsIGhlaWdodCA9IDUpCgpgYGAKCiMgUGxvdHRpbmcgYSBzdXJmYWNlIHdpdGggdGVtcGVyYXR1cmUgYW5kIGxvbmdpdHVkZQoKaHR0cHM6Ly9naXRodWIuY29tL2NhdGhtbWl0Y2hlbGwvcGxvdHRpbmdPY2VhbkRhdGFXaXRoUi93aWtpL0lycmVndWxhci1kYXRhCgpgYGB7cn0KYmlubmVkIDwtIGN0ZC53LnRpZGVzLmRpc3QgJT4lIAogICAgbXV0YXRlKHRpZGUgPSBpZmVsc2UodGlkZSA9PSAiQU1faW5jb21pbmciLCAiaW5jb21pbmcgdGlkZSAoQU0pIiwgIm91dGdvaW5nIHRpZGUgKFBNKSIpKSAlPiUKICBmaWx0ZXIoZGVwdGhfbSA8IDEwKSAlPiUKICBtdXRhdGVfYXQoNSwgcm91bmQpJT4lIAogIGdyb3VwX2J5KGRpc3RhbmNlLCB0aWRlLCBkZXB0aF9tKSAlPiUgCiAgc3VtbWFyaXplKGF2X3RtcCA9IG1lYW4odGVtcF9jKSkKCiMgZmxpcCBvcmRlciBzbyBoaWdoZXIgdGVtcHMgYXJlIGF0IHRoZSB0b3AhCmJpbm5lZAoKdGVtcHBsb3QgPC0gZ2dwbG90KGJpbm5lZCxhZXMoeD1kaXN0YW5jZSx5PS0xKihkZXB0aF9tKSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHRpZGUpKSsKICBnZW9tX2NvbnRvdXJfZmlsbGVkKGFlcyh6PWF2X3RtcCksIGFscGhhID0gMC44KSArCiAgICBnZW9tX3BvaW50KHNpemUgPTAuMSkgKwogIHRoZW1lX2J3KCkrCiAgIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0PTEwKSksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHI9MTApKSkgKwogIGxhYnMoeSA9ICJEZXB0aCAobSkiLAogICAgICAgeCA9ICJEaXN0YW5jZSBmcm9tIGhhdGNoZXJ5IHBlbnMgKG0pIiwKICAgICAgIGZpbGwgPSAiVGVtcGVyYXR1cmUgKEMpIikgKwogIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBjKDAsMCkpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDAuMDUpKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIsIGRpcmVjdGlvbiA9IC0xLAogICAgICAgICAgICAgICAgICAgIGd1aWRlID0gZ3VpZGVfbGVnZW5kKHJldmVyc2UgPSBUKSkKICAKCnRlbXBwbG90CgpnZ3NhdmUoInBkZl9vdXRwdXRzL2N0ZFRlbXAxMG1ldGVyc0Rpc3RhbmNlLnBuZyIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNSkKYGBgCldoeSBkbyBzb21lIG9mIHRoZSB0b3AgZGVwdGggdmFsdWVzIGRyb3Agb3V0PyBTb21ldGhpbmcgYWJvdXQgdGhlIGJpbm5pbmcuCgoKRG8gaXQgb25jZSBtb3JlLCBidXQgc2V0dGluZyB0aGUgZGVwdGggZXZlbiBzaGFsbG93ZXI6CgpgYGB7ciB0ZW1wLWJpbm5lZC0yfQpiaW5uZWQyIDwtIGN0ZC53LnRpZGVzLmRpc3QgJT4lIAogICAgbXV0YXRlKHRpZGUgPSBpZmVsc2UodGlkZSA9PSAiQU1faW5jb21pbmciLCAiaW5jb21pbmcgdGlkZSAoQU0pIiwgIm91dGdvaW5nIHRpZGUgKFBNKSIpKSAlPiUKICBmaWx0ZXIoZGVwdGhfbSA8IDIuNSkgJT4lCiAgbXV0YXRlX2F0KDUsIHJvdW5kLCAyKSU+JSAKICBncm91cF9ieShkaXN0YW5jZSwgdGlkZSwgZGVwdGhfbSkgJT4lIAogIHN1bW1hcml6ZShhdl90bXAgPSBtZWFuKHRlbXBfYykpCgoKZ2dwbG90KGJpbm5lZDIsYWVzKHg9ZGlzdGFuY2UseT0tMSooZGVwdGhfbSkpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyh0aWRlKSkrCiAgZ2VvbV9jb250b3VyX2ZpbGxlZChhZXMoej1hdl90bXApLCBhbHBoYSA9IDAuOCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9MC4xKSArCiAgdGhlbWVfYncoKSsKICAgdGhlbWUoCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQ9MTApKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4ocj0xMCkpKSArCiAgbGFicyh5ID0gIkRlcHRoIChtKSIsCiAgICAgICB4ID0gIkRpc3RhbmNlIGZyb20gaGF0Y2hlcnkgcGVucyAobSkiLAogICAgICAgZmlsbCA9ICJUZW1wZXJhdHVyZSAoQykiKQoKZ2dzYXZlKCJwZGZfb3V0cHV0cy9jdGRUZW1wM21ldGVyc0Rpc3RhbmNlLnBkZiIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNSkKYGBgCgoKRm9yIHNhbGluaXR5IGFuZCB0ZW1wLCBsZXQncyB6b29tIGluIG9uIHRoZSB0b3AgNSBtZXRlcnMgKHdlIHRvb2sgc2FtcGxlcyBmcm9tIHRoZSBmaXJzdCB+MSBtKQpgYGB7cn0KIyB0ZW1wCmN0ZC53LnRpZGVzLmRpc3QgJT4lCiAgbXV0YXRlKHRpZGUgPSBpZmVsc2UodGlkZSA9PSAiQU1faW5jb21pbmciLCAiaW5jb21pbmcgdGlkZSAoQU0pIiwgIm91dGdvaW5nIHRpZGUgKFBNKSIpKSAlPiUKICBmaWx0ZXIoZGVwdGhfbSA8IDUpICU+JQogIGdncGxvdChhZXMoeCA9IHRlbXBfYywgeSA9IC0xKihkZXB0aF9tKSwgY29sb3IgPSBkaXN0YW5jZSkpICsKICBnZW9tX3BvaW50KCkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnModGlkZSkpICsKICB0aGVtZV9idygpKwogICB0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odD0xMCkpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyPTEwKSkpICsKICBsYWJzKHkgPSAiRGVwdGggKG0pIiwKICAgICAgIHggPSAiVGVtcGVyYXR1cmUgKEMpIiwKICAgICAgIGNvbG9yID0gIkRpc3RhbmNlIChtKSIpCgpnZ3NhdmUoInBkZl9vdXRwdXRzL2N0ZFRlbXBQcm9maWxlM21ldGVyc0Rpc3RhbmNlLnBkZiIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gNSkKCmBgYAoKIyMjIFBsb3R0aW5nIGEgc3VyZmFjZSB3aXRoIHNhbGluaXR5IGFuZCBsb25naXR1ZGUKCgpgYGB7ciBzYWxpbml0eS1wbG90fQoKYmlubmVkU2FsaW5pdHkgPC0gY3RkLncudGlkZXMuZGlzdCAlPiUgCiAgICBtdXRhdGUodGlkZSA9IGlmZWxzZSh0aWRlID09ICJBTV9pbmNvbWluZyIsICJpbmNvbWluZyB0aWRlIChBTSkiLCAib3V0Z29pbmcgdGlkZSAoUE0pIikpICU+JQogIGZpbHRlcihkZXB0aF9tIDwgMTApICU+JQogIG11dGF0ZV9hdCg1LCByb3VuZCklPiUgCiAgZ3JvdXBfYnkoZGlzdGFuY2UsIHRpZGUsIGRlcHRoX20pICU+JSAKICBzdW1tYXJpemUoYXZfc2FsaW5pdHkgPSBtZWFuKHNhbGluaXR5KSkKCiMgb3Jhbml6ZSBjb2xvcnMKbXljb2xvcnMgPC0gY29sb3JSYW1wUGFsZXR0ZShicmV3ZXIucGFsKDksICJPcmFuZ2VzIikpKDExKQoKCnNhbHBsb3QgPC0gZ2dwbG90KGJpbm5lZFNhbGluaXR5LCBhZXMoeCA9IGRpc3RhbmNlLCB5ID0gLTEqKGRlcHRoX20pKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnModGlkZSkpICsKICBnZW9tX2NvbnRvdXJfZmlsbGVkKGFlcyh6ID0gYXZfc2FsaW5pdHkpLCBhbHBoYSA9IDAuOCkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMC4xKSArCiAgICB0aGVtZV9idygpICsKICAgICB0aGVtZSgKICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0PTEwKSksCiAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4ocj0xMCkpKSArCiAgICAgIGxhYnMoeSA9ICJEZXB0aCAobSkiLAogICAgICAgICAgIHggPSAiRGlzdGFuY2UgZnJvbSBoYXRjaGVyeSBwZW5zIChtKSIsCiAgICAgICAgICAgZmlsbCA9ICJTYWxpbml0eSAoUFNVKSIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwwLjA1KSkKCgpzYWxwbG90CgpnZ3NhdmUoInBkZl9vdXRwdXRzL2N0ZFNhbGluaXR5MTBtZXRlcnNEaXN0YW5jZS5wbmciLCB3aWR0aCA9IDgsIGhlaWdodCA9IDUpCmBgYAoKYGBge3Igc2FsaW5pdHktYmlubmVkLTJ9CmJpbm5lZFNhbDIgPC0gY3RkLncudGlkZXMuZGlzdCAlPiUgCiAgICBtdXRhdGUodGlkZSA9IGlmZWxzZSh0aWRlID09ICJBTV9pbmNvbWluZyIsICJpbmNvbWluZyB0aWRlIChBTSkiLCAib3V0Z29pbmcgdGlkZSAoUE0pIikpICU+JQogIGZpbHRlcihkZXB0aF9tIDwgMi41KSAlPiUKICBtdXRhdGVfYXQoNSwgcm91bmQsIDIpJT4lIAogIGdyb3VwX2J5KGRpc3RhbmNlLCB0aWRlLCBkZXB0aF9tKSAlPiUgCiAgc3VtbWFyaXplKGF2X3NhbCA9IG1lYW4oc2FsaW5pdHkpKQoKCmdncGxvdChiaW5uZWRTYWwyLGFlcyh4PWRpc3RhbmNlLHk9LTEqKGRlcHRoX20pKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnModGlkZSkpKwogIGdlb21fY29udG91cl9maWxsZWQoYWVzKHo9YXZfc2FsKSwgYWxwaGEgPSAwLjgpICsKICBnZW9tX3BvaW50KHNpemUgPTAuMSkgKwogIHRoZW1lX2J3KCkrCiAgIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0PTEwKSksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHI9MTApKSkgKwogIGxhYnMoeSA9ICJEZXB0aCAobSkiLAogICAgICAgeCA9ICJEaXN0YW5jZSBmcm9tIGhhdGNoZXJ5IHBlbnMgKG0pIiwKICAgICAgIGZpbGwgPSAiU2FsaW5pdHkgKFBTVSkiKQoKZ2dzYXZlKCJwZGZfb3V0cHV0cy9jdGRTYWxpbml0eTNtZXRlcnNEaXN0YW5jZS5wbmciLCB3aWR0aCA9IDgsIGhlaWdodCA9IDUpCmBgYAoKCmBgYHtyIG1ha2UtU0ktZmlndXJlLVMyfQpsaWJyYXJ5KHBhdGNod29yaykKCnNhbHBsb3QgKyB0ZW1wcGxvdCArIHBsb3RfbGF5b3V0KG5yb3cgPSAyKSArIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gIkEiKQoKZ2dzYXZlKCJwZGZfb3V0cHV0cy9jdGRfZGF0YTIwMjFfZHVhbHBsb3QucG5nIiwgd2lkdGggPSA4LCBoZWlnaHQgPSA4KQpgYGAKCgpgYGB7cn0KY3RkLncudGlkZXMuZGlzdCAlPiUKICBncm91cF9ieSh0aWRlKSAlPiUKICBzdW1tYXJpc2UobWF4KHNhbGluaXR5KSkKYGBgCgoKCgpEZW5zaXR5CgpgYGB7cn0KZGVuc2l0eTEgPC0gY3RkLncudGlkZXMuZGlzdCAlPiUgCiAgbXV0YXRlKHRpZGUgPSBpZmVsc2UodGlkZSA9PSAiQU1faW5jb21pbmciLCAiaW5jb21pbmcgdGlkZSAoQU0pIiwgIm91dGdvaW5nIHRpZGUgKFBNKSIpKSAlPiUKICBmaWx0ZXIoZGVwdGhfbSA8IDEwKSAlPiUKICBtdXRhdGVfYXQoNSwgcm91bmQpJT4lIAogIGdyb3VwX2J5KGRpc3RhbmNlLCB0aWRlLCBkZXB0aF9tKSAlPiUgCiAgc3VtbWFyaXplKGF2X2RlbnNpdHkgPSBtZWFuKGRlbnNpdHkpKSAjIHRoZSBhdmcgbmVlZHMgdG8gYmUgdGFrZW4gZm9yIHByb3BlciBwbG90dGluZyBpbiB0aGlzIHdheS4KCmdncGxvdChkZW5zaXR5MSxhZXMoeD1kaXN0YW5jZSx5PS0xKihkZXB0aF9tKSkpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKHRpZGUpKSsKICBnZW9tX2NvbnRvdXJfZmlsbGVkKGFlcyh6PWRlbnNpdHkpLCBhbHBoYSA9IDAuOCkgKwogICAgZ2VvbV9wb2ludChzaXplID0wLjEpICsKICB0aGVtZV9idygpKwogICB0aGVtZSgKICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4odD0xMCkpLAogICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihyPTEwKSkpICsKICBsYWJzKHkgPSAiRGVwdGggKG0pIiwKICAgICAgIHggPSAiRGlzdGFuY2UgZnJvbSBoYXRjaGVyeSBwZW5zIChtKSIsCiAgICAgICBmaWxsID0gIkRlbnNpdHkgKGtnL21eMykiKQoKI2dnc2F2ZSgicGRmX291dHB1dHMvY3RkVGVtcDEwbWV0ZXJzRGlzdGFuY2UucGRmIiwgd2lkdGggPSA4LCBoZWlnaHQgPSA1KQpgYGAKCgoKIyMgVGlkZSBkYXRhCgpUaWRlIGRhdGEgd2FzIG9idGFpbmVkIGZyb20gdGhlIE5PQUEgVGlkZXMgd2Vic2l0ZTogdGlkZXNhbmRjdXJyZW50cy5ub2FhLmdvdgoKaHR0cHM6Ly90aWRlc2FuZGN1cnJlbnRzLm5vYWEuZ292L3dhdGVybGV2ZWxzLmh0bWw/aWQ9OTQ1MjIxMCZ1bml0cz1zdGFuZGFyZCZiZGF0ZT0yMDIxMDUxMCZlZGF0ZT0yMDIxMDUxMSZ0aW1lem9uZT1MU1QvTERUJmRhdHVtPU1MTFcmaW50ZXJ2YWw9NiZhY3Rpb249CmBgYHtyIHJlYWQtaW4tdGlkZS1kYXRhfQp0aWRlcyA8LSByZWFkX2NzdigiLi4vZGF0YS9KdW5lYXVUaWRlc18yMDIxTWF5LmNzdiIsCiAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHNfb25seShEYXRlPWNvbF9kYXRlKCIlWS8lbS8lZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGltZSAoTFNUL0xEVClgPWNvbF90aW1lKCIlSDolTSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVmVyaWZpZWQgKGZ0KWA9Y29sX2RvdWJsZSgpKSkgCiMgZml4IHZhcmlhYmxlIG5hbWVzCnRpZGVzLnJlbmFtZWQgPC0gdGlkZXMgJT4lCiAgcmVuYW1lKHRpbWUgPSBgVGltZSAoTFNUL0xEVClgLCBoZWlnaHRfZnQgPSBgVmVyaWZpZWQgKGZ0KWApCgojIGNyZWF0ZSBhIG1lcmdlZCBjb2x1bW4gd2l0aCBkYXRlIGFuZCB0aW1lIHRvIHRoZW4gcm91bmQgdG8gdGhlIGhvdXIgYXMgaW4gdGhlIENURCBkYXRhCnRpZGVzLnJlbmFtZWQkbmV3ZGF0ZSA8LSB3aXRoKHRpZGVzLnJlbmFtZWQsIGFzLlBPU0lYY3QocGFzdGUoRGF0ZSwgdGltZSksIGZvcm1hdD0iJVktJW0tJWQgJUg6JU06JVMiKSkKCnRpZGVzLmhvdXIgPC0gdGlkZXMucmVuYW1lZCAlPiUKICBtdXRhdGUocm91bmRfdGltZSA9IHJvdW5kX2RhdGUobmV3ZGF0ZSwgdW5pdCA9ICJob3VycyIpKSAlPiUgIyByb3VuZCB0aW1lIHN0YW1wcyB0byB0aGUgaG91cgogIHNlcGFyYXRlKHJvdW5kX3RpbWUsIGludG8gPSBjKCJ5bWQiLCAiaG91ciIpLCBzZXAgPSAiICIpICU+JQogIG11dGF0ZShob3VyID0gYXNfaG1zKGhvdXIpKSAKYGBgCkxvb2sgYXQgam9pbmluZyB0aGUgdGlkZSBkYXRhIHdpdGggdGhlIGN0ZCBkYXRhIGJhc2VkIG9uIHRpbWUKCmBgYHtyIHBsb3QtdGlkYWwtY3ljbGUtMjAyMX0KIyBpbnN0YWxsLnBhY2thZ2VzKCJkZXZ0b29scyIpCiNsaWJyYXJ5KGRldnRvb2xzKQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJlbGxpc3ZhbGVudGluZXIvbHVicmlkYXRlRXh0cmFzIikKCiMgZnJvbSB0aGUgY3RkIHRpbWUgc3RhbXAsIEkgbmVlZCB0byBzZXBhcmF0ZSB0aGUgZGF0ZSBmcm9tIHRoZSB0aW1lCmN0ZC53LnRpZGVzLmRpc3QkdGltZSA8LSB5bWRfaG1zKGN0ZC53LnRpZGVzLmRpc3QkdGltZSkKCgpjdGQudGltZXMgPC0gY3RkLncudGlkZXMuZGlzdCAlPiUKICBtdXRhdGUocm91bmRfdGltZSA9IHJvdW5kX2RhdGUodGltZSwgdW5pdCA9ICJob3VycyIpKSAlPiUgIyByb3VuZCB0aW1lIHN0YW1wcyB0byB0aGUgaG91cgogIHNlcGFyYXRlKHJvdW5kX3RpbWUsIGludG8gPSBjKCJ5bWQiLCAiaG91ciIpLCBzZXAgPSAiICIpICU+JQogIG11dGF0ZShob3VyID0gYXNfaG1zKGhvdXIpKSAKICAKCnRpZGVQbG90MjAyMSA8LSB0aWRlcy5ob3VyICU+JQogIGZpbHRlcihEYXRlID09ICIyMDIxLTA1LTEwIiB8IERhdGUgPT0gIjIwMjEtMDUtMDkiKSAlPiUKICBsZWZ0X2pvaW4oLiwgY3RkLnRpbWVzLCBieSA9IGMoImhvdXIiLCAieW1kIikpICU+JQogIGdncGxvdChhZXMoeD1uZXdkYXRlLCB5PWhlaWdodF9mdCwgY29sb3IgPSBkaXN0YW5jZSkpICsKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0PTEwKSksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHI9MTApKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4oYj0xMCkpKSArCiAgbGFicyh5ID0gIlRpZGUgaGVpZ2h0IChmdCkiLAogICAgICAgeCA9ICJEYXRlLXRpbWUiLAogICAgICAgY29sb3IgPSAiRGlzdGFuY2UgZnJvbSBoYXRjaGVyeSBwZW5zIChtKSIpICsKICBzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uID0gInBsYXNtYSIsIGRpcmVjdGlvbiA9IC0xKQogIAp0aWRlUGxvdDIwMjEKCmdnc2F2ZSgicGRmX291dHB1dHMvdGlkZUN5Y2xlU2FtcGxpbmcucG5nIiwgd2lkdGggPSA4LCBoZWlnaHQgPSA1KQoKYGBgCgpgYGB7ciBhbHRlcm5hdGl2ZS1wbG90LTIwMjF9CiMgcmVtb3ZpbmctZGlzdGFuY2UtYW5kLWp1c3QtdXNpbmctc2FtcGxpbmctcGVyaW9kCgp0aWRlUGxvdDIwMjEgPC0gdGlkZXMuaG91ciAlPiUKICBmaWx0ZXIoRGF0ZSA9PSAiMjAyMS0wNS0xMCIgfCBEYXRlID09ICIyMDIxLTA1LTA5IikgJT4lCiAgbGVmdF9qb2luKC4sIGN0ZC50aW1lcywgYnkgPSBjKCJob3VyIiwgInltZCIpKSAlPiUKICBtdXRhdGUoc2FtcGxpbmdfcGVyaW9kID0gaWZlbHNlKGlzLm5hKGN0ZF9zYW1wbGUpLCAibm8iLCAieWVzIikpICU+JQogIGdncGxvdChhZXMoeCA9IG5ld2RhdGUsIHkgPSBoZWlnaHRfZnQsIGNvbG9yID0gc2FtcGxpbmdfcGVyaW9kKSkgKwogIGdlb21fcG9pbnQoKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUoCiAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHQ9MTApKSwKICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4ocj0xMCkpLAogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbihiPTEwKSkpICsKICBsYWJzKHkgPSAiVGlkZSBoZWlnaHQgKGZ0KSIsCiAgICAgICB4ID0gIkRhdGUtdGltZSIsCiAgICAgICBjb2xvciA9ICJTYW1wbGluZyBwZXJpb2QiKSArCiAgI3NjYWxlX2NvbG9yX3ZpcmlkaXNfYyhvcHRpb24gPSAicGxhc21hIiwgZGlyZWN0aW9uID0gLTEpICsKc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImdyYXkiLCAiZGFya2dyZWVuIikpCiAKdGlkZVBsb3QyMDIxCgoKYGBgCgoKCgpgYGB7ciBpbXBvcnQtdGlkZS1kYXRhLTIwMjJ9CiMgcmVhZCBpbiB0aWRlIGRhdGEgZnJvbSAyMDIyCnRpZGVzMjAyMiA8LSByZWFkX2NzdigiLi4vZGF0YS9KdW5lYXVUaWRlc18yMDIyTWF5LmNzdiIsCiAgICAgICAgICAgICAgICAgIGNvbF90eXBlcyA9IGNvbHNfb25seShEYXRlPWNvbF9kYXRlKCIlWS8lbS8lZCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGltZSAoTFNUL0xEVClgPWNvbF90aW1lKCIlSDolTSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVmVyaWZpZWQgKGZ0KWA9Y29sX2RvdWJsZSgpKSkgCiMgZml4IHZhcmlhYmxlIG5hbWVzCnRpZGVzLnJlbmFtZWQyIDwtIHRpZGVzMjAyMiAlPiUKICByZW5hbWUodGltZSA9IGBUaW1lIChMU1QvTERUKWAsIGhlaWdodF9mdCA9IGBWZXJpZmllZCAoZnQpYCkKCiMgY3JlYXRlIGEgbWVyZ2VkIGNvbHVtbiB3aXRoIGRhdGUgYW5kIHRpbWUgdG8gdGhlbiByb3VuZCB0byB0aGUgaG91ciBhcyBpbiB0aGUgQ1REIGRhdGEKdGlkZXMucmVuYW1lZDIkbmV3ZGF0ZSA8LSB3aXRoKHRpZGVzLnJlbmFtZWQyLCBhcy5QT1NJWGN0KHBhc3RlKERhdGUsIHRpbWUpLCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTIikpCgp0aWRlcy5ob3VyMiA8LSB0aWRlcy5yZW5hbWVkMiAlPiUKICBtdXRhdGUocm91bmRfdGltZSA9IHJvdW5kX2RhdGUobmV3ZGF0ZSwgdW5pdCA9ICJob3VycyIpKSAlPiUgIyByb3VuZCB0aW1lIHN0YW1wcyB0byB0aGUgaG91cgogIHNlcGFyYXRlKHJvdW5kX3RpbWUsIGludG8gPSBjKCJ5bWQiLCAiaG91ciIpLCBzZXAgPSAiICIpICU+JQogIG11dGF0ZShob3VyID0gYXNfaG1zKGhvdXIpKQpgYGAKCmBgYHtyIENURC1kYXRhLTIwMjJ9CiMgaW1wb3J0IENURCBkYXRhIGZvciBNYXktNQpjdGQuMjAyMiA8LSByZWFkX2NzdigiLi4vZGF0YS8yMDIyY3RkRGF0YWZyYW1lLmNzdiIpCgojIGdyYWIgdGhlIGRhdGEgZm9yIE1heSA1IGFuZCBvbmUgdGlkZSBmb3IgZGF0YSBwb2ludHMgZm9yIHRoZSBtYXAKb25lLnNldC4yMDIyIDwtIGN0ZC4yMDIyICU+JQogIGZpbHRlcihzdHJfZGV0ZWN0KHRpbWUsICIyMDIyLTA1LTA1IikpICU+JQogICNkcGx5cjo6c2VsZWN0KHRpbWUsIGN0ZF9zYW1wbGUsIGxhdCwgbG9uZykgJT4lCiAgdW5pcXVlKCkgJT4lCiAgZmlsdGVyKCFjdGRfc2FtcGxlICVpbiUgYygiMTYzMDI0IiwgIjE5MTkzNSIsICIxNzUzMzciLCAiMTg1MDQ3IikpICU+JQogIG11dGF0ZShZZWFyID0gIjIwMjIiKQoKb25lLnNldC4yMDIyCgojIGZyb20gdGhlIGN0ZCB0aW1lIHN0YW1wLCBJIG5lZWQgdG8gc2VwYXJhdGUgdGhlIGRhdGUgZnJvbSB0aGUgdGltZQpvbmUuc2V0LjIwMjIkdGltZSA8LSB5bWRfaG1zKG9uZS5zZXQuMjAyMiR0aW1lKQoKY3RkLnRpbWVzLjIwMjIgPC0gb25lLnNldC4yMDIyICU+JQogIG11dGF0ZShyb3VuZF90aW1lID0gcm91bmRfZGF0ZSh0aW1lLCB1bml0ID0gImhvdXJzIikpICU+JSAjIHJvdW5kIHRpbWUgc3RhbXBzIHRvIHRoZSBob3VyCiAgc2VwYXJhdGUocm91bmRfdGltZSwgaW50byA9IGMoInltZCIsICJob3VyIiksIHNlcCA9ICIgIikgJT4lCiAgbXV0YXRlKGhvdXIgPSBhc19obXMoaG91cikpCiAgCmBgYAoKCmBgYHtyIHBsb3QtdGlkYWwtY3ljbGUtMjAyMn0KdGlkZVBsb3QyMDIyIDwtIHRpZGVzLmhvdXIyICU+JQogIGZpbHRlcihEYXRlID09ICIyMDIyLTA1LTA0IiB8IERhdGUgPT0gIjIwMjItMDUtMDUiKSAlPiUKICBsZWZ0X2pvaW4oLiwgY3RkLnRpbWVzLjIwMjIsIGJ5ID0gYygiaG91ciIsICJ5bWQiKSkgJT4lCiAgbXV0YXRlKHNhbXBsaW5nX3BlcmlvZCA9IGlmZWxzZShpcy5uYShjdGRfc2FtcGxlKSwgIm5vIiwgInllcyIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBuZXdkYXRlLCB5ID0gaGVpZ2h0X2Z0LCBjb2xvciA9IHNhbXBsaW5nX3BlcmlvZCkpICsKICBnZW9tX3BvaW50KCkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKAogICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KG1hcmdpbiA9IG1hcmdpbih0PTEwKSksCiAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQobWFyZ2luID0gbWFyZ2luKHI9MTApKSwKICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChtYXJnaW4gPSBtYXJnaW4oYj0xMCkpKSArCiAgbGFicyh5ID0gIlRpZGUgaGVpZ2h0IChmdCkiLAogICAgICAgeCA9ICJEYXRlLXRpbWUiLAogICAgICAgY29sb3IgPSAiU2FtcGxpbmcgcGVyaW9kIikgKwogICNzY2FsZV9jb2xvcl92aXJpZGlzX2Mob3B0aW9uID0gInBsYXNtYSIsIGRpcmVjdGlvbiA9IC0xKSArCnNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmF5IiwgImRhcmtncmVlbiIpKQoKICAKdGlkZVBsb3QyMDIyCgpnZ3NhdmUoInBkZl9vdXRwdXRzL3RpZGVDeWNsZVNhbXBsaW5nMjAyMi5wbmciLCB3aWR0aCA9IDgsIGhlaWdodCA9IDUpCgpgYGAKCmBgYHtyfQojIGRvdWJsZSBjaGVjayB0aGUgc2FtcGxpbmcgdG8gc2VlIGlmIGl0IG92ZXJsYXBzIHNsYWNrIHRpZGU/CnRpZGVzLmhvdXIyICU+JQogIGZpbHRlcihEYXRlID09ICIyMDIyLTA1LTA1IikgJT4lCiAgbGVmdF9qb2luKC4sIGN0ZC50aW1lcy4yMDIyLCBieSA9IGMoImhvdXIiLCAieW1kIikpICU+JQogIGZpbHRlcih0aWRlID09ICJBTV9vdXRnb2luZyIpICU+JQogIG11dGF0ZShzYW1wbGluZ19wZXJpb2QgPSBpZmVsc2UoaXMubmEoY3RkX3NhbXBsZSksICJubyIsICJ5ZXMiKSkgJT4lCiAgZmlsdGVyKGhlaWdodF9mdCA8IG1pbihoZWlnaHRfZnQpKzEpICU+JQogIGdncGxvdChhZXMoeCA9IGxvbmcsIHkgPSBsYXQsIGNvbG9yID0gbmV3ZGF0ZSkpICsKICBnZW9tX3BvaW50KCkKCmBgYApNaW5pbXVtIHRpZGFsIGhlaWdodCB3YXMgYXQgMTA6MzY7IHRoZSBwYXJhbGxlbCB0cmFuc2VjdCB3YXMgc2FtcGxlZCBhZnRlciAxMSBhbSwgc28gaXQgd2FzIGFzIHRoZSB0aWRlIHR1cm5lZC4KCgoKYGBge3IgY29tYmluZS1wbG90cy1ib3RoLXllYXJzfQojIG1ha2Ugc3VwcGxlbWVudGFsIGZpZ3VyZQp0aWRlUGxvdDIwMjEgKyB0aWRlUGxvdDIwMjIgKyAKICBwbG90X2xheW91dChuY29sID0gMSkgKwogIHBsb3RfYW5ub3RhdGlvbih0YWdfbGV2ZWxzID0gIkEiKQoKZ2dzYXZlKCJwZGZfb3V0cHV0cy9TSWZpZ3VyZV90aWRlQ3ljbGVfYm90aFllYXJzLnBuZyIsIHdpZHRoID0gOCwgaGVpZ2h0ID0gOCkKCmBgYAoK